Skip to content

fix: stop filing Anvil applications under "AI Agents", rename them "responsive" - #42219

Merged
salevine merged 1 commit into
releasefrom
fix/app-15954
Sep 11, 2026
Merged

fix: stop filing Anvil applications under "AI Agents", rename them "responsive"#42219
salevine merged 1 commit into
releasefrom
fix/app-15954

Conversation

@salevine

@salevine salevine commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Description

Two user-facing problems on the workspace applications screen.

1. ANVIL applications were filed under an "AI Agents" heading.

ApplicationsSection renders a single anvilApplications card list whose title was picked by a ternary:

title={createMessage(
  isAiAgentFlowEnabled ? AI_AGENTS_APPLICATIONS : ANVIL_APPLICATIONS,
)}

With license_ai_agent_enabled on, every ANVIL application was filed under a heading calling it an AI agent. They are not AI agents — they are ANVIL-layout applications that happen to share the list. The emptyStateMessage directly above used the same ternary. Both are removed; the heading and empty state are now unconditional.

2. The user-facing name for the ANVIL layout system becomes "responsive".

Constant Was Now
ANVIL_APPLICATIONS Anvil apps Responsive applications
NEW_ANVIL_APP Anvil app Responsive application
ANVIL_APPLICATION_CARD_LIST_ZERO_STATE There are no Anvil apps in this workspace yet. There are no responsive applications in this workspace.

Sentence case and "applications" rather than "apps", to match every sibling rendered on the same screen — APPLICATIONS, NEW_APP, APPLICATION_CARD_LIST_ZERO_STATE. "responsive" stays lowercase mid-sentence because it is a descriptor, not a brand name.

Note FIXED_APPLICATIONS ("Classic Applications") is dead code — defined but referenced nowhere — so it is not the title-cased counterweight it appears to be. The headings that actually render are "Applications", this one, "Packages" and "Workflows".

Fixes https://linear.app/appsmith/issue/APP-15954

Scope — user-facing strings only

The internal name stays "Anvil" everywhere: the persisted appPositioning.type == ANVIL enum, LayoutSystemTypes.ANVIL, the feature flags, module paths and every data-testid. Renaming the persisted enum would require a migration and would silently un-gate every existing Anvil application, since the paid-entitlement gate keys on that literal value.

Testing

Adds ce/pages/Applications/tests/ApplicationsSection.test.tsx — two tests, both verified red against pre-fix source:

✕ titles the ANVIL application list 'Responsive applications', not 'AI Agents', …
✕ uses the responsive empty-state copy when the workspace has no ANVIL applications

TestingLibraryElementError: Unable to find an element with the text: Responsive applications.

with the printed DOM showing the heading as AI Agents and the zero state as There are no AI Agents in this workspace.

It renders ApplicationsSection deliberately, not ApplicationCardList — that component forwards title verbatim to CardList, so a test there would prove only "the component renders the title it was handed" and would pass both before and after the fix. The decision being fixed lives in ApplicationsSection.

Reverting only the ternary while leaving the string rename applied isolates the mis-filing decision from the rename.

Known issue, deliberately not fixed here

The render gate on that block is wrong, and this PR does not change it. isAnvilEnabled resolves through getIsAnvilLayoutEnabled, which reads the retired release_anvil_enabled flag — no longer in the server's FeatureFlagEnum, so never served, and defaulted to false. The gate therefore collapses to isAiAgentFlowEnabled alone.

Consequence: an organization licensed for Anvil without the AI-agent flag never renders this section at all, and because anvilApplications is partitioned out of nonAnvilApplications, its applications appear in neither list. That is pre-existing, is a behaviour change to fix, and needs its own test — so it is tracked separately rather than folded in here.

getIsAnvilLayoutEnabled's JSDoc also claims it is @deprecated DEAD / RETIRED (M5) with "ZERO production callers", which is false — ApplicationsSection is a live caller. Worth correcting alongside that fix.

Impact on existing instances

Label-only. No schema change, no migration, no persisted-data change, no flag change. Existing applications are unaffected functionally; ANVIL ones move from an "AI Agents" heading to "Responsive applications". Rollback is a revert.

Companion EE change (removing the unused AI Agent create-menu item, and renaming the EE license-gate copy and instance-setting label) ships separately in appsmith-ee and depends on this landing first, since the create-menu label lives in this file.

Automation

/ok-to-test tags="@tag.All"

Tip

🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
Workflow run: https://github.com/appsmithorg/appsmith/actions/runs/34511756341
Commit: 9212b47
Cypress dashboard.
Tags: @tag.All
Spec:


Thu, 10 Sep 2026 19:07:42 UTC

Summary by CodeRabbit

  • Updates
    • Updated application labels to use “Responsive” terminology, including “Responsive applications” and “Responsive application.”
    • Standardized application list headings and empty states to display responsive application messaging consistently.
    • Corrected a display issue where AI-agent labels could appear for responsive applications.

…esponsive"

Two user-facing problems on the workspace applications screen.

1. ANVIL-layout applications were shown under a heading reading "AI Agents".

   ApplicationsSection renders a single anvilApplications card list whose
   title was picked by a ternary:

     title={createMessage(
       isAiAgentFlowEnabled ? AI_AGENTS_APPLICATIONS : ANVIL_APPLICATIONS,
     )}

   With license_ai_agent_enabled on, every ANVIL application was filed under
   a heading calling it an AI agent. They are not AI agents — they are
   ANVIL-layout applications that happen to share the list. The
   emptyStateMessage directly above used the same ternary.

   Both ternaries are removed. The heading and the empty state are now
   unconditional, so the list is named for what it contains.

2. The user-facing name for the ANVIL layout system becomes "responsive".

     ANVIL_APPLICATIONS                     Anvil apps  -> Responsive applications
     NEW_ANVIL_APP                          Anvil app   -> Responsive application
     ANVIL_APPLICATION_CARD_LIST_ZERO_STATE              -> "There are no responsive
                                                            applications in this
                                                            workspace."

   Sentence case, and "applications" rather than "apps", to match every
   sibling rendered on the same screen — APPLICATIONS, NEW_APP and
   APPLICATION_CARD_LIST_ZERO_STATE. "responsive" stays lowercase
   mid-sentence because it is a descriptor, not a brand name. (FIXED_APPLICATIONS,
   "Classic Applications", is dead code and never renders, so it is not the
   title-cased counterweight it appears to be.)

The INTERNAL name stays "Anvil" everywhere: the persisted
appPositioning.type == ANVIL enum, LayoutSystemTypes.ANVIL, the feature
flags, module paths and every data-testid are untouched. Renaming the
persisted enum would require a migration and would silently un-gate every
existing Anvil application, since the paid-entitlement gate keys on that
literal value.

Test: adds ApplicationsSection.test.tsx, which renders ApplicationsSection
with getIsAiAgentFlowEnabled forced true — the state that produced the bug.
It deliberately does NOT test ApplicationCardList, which forwards `title`
verbatim to CardList and would therefore pass both before and after the fix.
Verified red against pre-fix source, failing with the DOM rendering
"AI Agents" and "There are no AI Agents in this workspace.". Reverting only
the ternary while leaving the string rename applied isolates the mis-filing
decision from the rename.

Known, deliberately not fixed here: the render gate on that block is wrong.
isAnvilEnabled resolves through getIsAnvilLayoutEnabled, which reads the
RETIRED release_anvil_enabled flag — never served, so always false in
production. The gate collapses to isAiAgentFlowEnabled alone, so an
organization licensed for Anvil without the AI-agent flag never sees this
section at all and its applications appear in neither list. That is a
behaviour change needing its own test and is tracked separately.

APP-15954

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RH3iMFoeZY87CCNSWLfCh6
@salevine
salevine requested a review from a team as a code owner September 10, 2026 18:01
@salevine
salevine requested a review from subrata71 September 10, 2026 18:01
@linear-code

linear-code Bot commented Sep 10, 2026

Copy link
Copy Markdown

APP-15954

@salevine salevine added the ok-to-test Required label for CI label Sep 10, 2026
@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Essentials

Run ID: a818e81f-dfd6-4185-b08b-a820e200dcca

📥 Commits

Reviewing files that changed from the base of the PR and between d754da7 and 9212b47.

📒 Files selected for processing (3)
  • app/client/src/ce/constants/messages.ts
  • app/client/src/ce/pages/Applications/index.tsx
  • app/client/src/ce/pages/Applications/tests/ApplicationsSection.test.tsx

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.


Walkthrough

The application list now uses “Responsive” labels for Anvil applications. It always renders Anvil headings and empty-state text. Regression tests cover populated and empty Anvil application lists with the AI-agent flow enabled.

Changes

Responsive application labels

Layer / File(s) Summary
Responsive label contract
app/client/src/ce/constants/messages.ts
The exported Anvil labels now use “Responsive applications” and “Responsive application” terminology. Comments document unchanged internal identifiers.
Application list behavior and regression coverage
app/client/src/ce/pages/Applications/index.tsx, app/client/src/ce/pages/Applications/tests/ApplicationsSection.test.tsx
The Anvil application list always uses Anvil messages. Tests verify Responsive headings and empty-state text, and reject AI-agent labels.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: sondermanish

Merge Risk: ⚪ Minimal · up to 9212b

The Applications screen now consistently uses Responsive terminology for ANVIL applications, with focused coverage for populated and empty states. No concrete merge-blocking production risk is identified.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes both primary changes: removing the incorrect “AI Agents” classification and renaming Anvil applications to “responsive.”
Description check ✅ Passed The description provides motivation, implementation details, issue reference, scope, testing evidence, known limitations, and impact. The communication section and explicit validation checkbox selecti…
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 3 files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/app-15954

Responsive labels line up in a row
Anvil headings clearly glow
Empty states speak with care
AI-agent text is nowhere there
Regression tests guard the show

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the Bug Something isn't working label Sep 10, 2026

@subrata71 subrata71 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@salevine
salevine merged commit 172b7c1 into release Sep 11, 2026
99 checks passed
@salevine
salevine deleted the fix/app-15954 branch September 11, 2026 15:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Bug Something isn't working ok-to-test Required label for CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants